package com.liuyz.inputstream_;

import org.junit.Test;

import java.io.FileInputStream;
import java.io.IOException;

public class 文件字节输入流 {

    // 一个一个字节的进行读取
    @Test
    public void read_1() {
        String filePath = "d:\\test.txt";
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
            int len = 0;
            // read()：读取一个字节，如果返回是-1则说明文件读取到末尾
            // 在读取到中文时，因为一个中文会占用多个字节，只输出一个字节就会造成乱码
            while ((len = inputStream.read()) != -1) {
                // 将字节转为char字符
                System.out.print((char) len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != inputStream) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // 按字节数组进行读取，将读取到的结果保存在字节数组
    @Test
    public void read_2() {
        String filePath = "d:\\test.txt";
        FileInputStream inputStream = null;
        byte[] byteArr = new byte[1024];
        int readLength = 0;
        try {
            inputStream = new FileInputStream(filePath);
            // read(byte[] b)：读取byteArr长度的字节数到byteArr
            // 第二次循环读取到的是第二次的内容，会覆盖掉第一次读取
            // 如果刚好在末尾读取到了中文字符的中间字节，那么就会造成乱码
            // 如果返回是-1则说明文件读取到末尾
            while ((readLength = inputStream.read(byteArr)) != -1) {
                // 将byteArr这个字节数组转换为当前长度的字符串
                System.out.print(new String(byteArr, 0, readLength));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != inputStream) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
